package day14;

import java.util.concurrent.TimeUnit;

/**
 * @author: 王丹
 * @create: 2021-07-06 14:08
 **/
//使用Object类中的方法实现线程等待和唤醒
public class Demo1 {
    static Object lock = new Object();

    /**
     * 运行结果分析：
     * t1线程中调用 lock.wait()方法让t1线程等待，主线程中休眠5秒之后，调用 lock.notify()方法
     * 唤醒了t1线程，输出的结果中，两行结果相差5秒左右，程序正常退出。
     */
    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            synchronized (lock) {
                System.out.println(System.currentTimeMillis() + "," + Thread.currentThread().getName() + " start!");
                try {
                    lock.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(System.currentTimeMillis() + "," + Thread.currentThread().getName() + " 被唤醒!");
            }
        });
        t1.setName("t1");
        t1.start();
        TimeUnit.SECONDS.sleep(3L);
        //注意必须使用synchronized获取对象监视器，否则抛出java.lang.IllegalMonitorStateException异常
        //抛出该异常表明某一线程已经试图等待对象的监视器，或者试图通知其他正在等待对象的监视器，
        //然而本身没有指定的监视器的线程。
        synchronized (lock) {
            lock.notify();
        }
    }
}
